#pragma once
#include <atomic>
#include <iostream>
/* 自旋锁
*  特性：当锁被另一个线程占用时，当前线程不交出线程所有权，无限循环检查锁的占用情况
*  优点：不用释放线程操作
*  缺点：如果锁长时间被另外一个线程占用，当前线程会陷入长时间的死循环
*  适用场景：对响应要求高，并且响应所需时间短的情求
*/
class SpinLock
{
private:
	std::atomic<bool> _flag = ATOMIC_VAR_INIT(false);
public:
	SpinLock() = default;
	SpinLock(const SpinLock&) = delete;
	SpinLock& operator= (const SpinLock&) = delete;
	void lock()
	{
		bool expected = false;
		while (!_flag.compare_exchange_strong(expected, true))
			expected = false;
	}
	void unlock()
	{
		_flag.store(false);
	}
};
//智能的锁使用类，在该变量作用域内，锁会自动的占用和释放
template<typename T>
class SmartLock
{
private:
	T & _mutex;
public:
	SmartLock(T& mutex_) :_mutex(mutex_)
	{
		_mutex.lock();
	}
	~SmartLock()
	{
		_mutex.unlock();
	}
};